const multer = require("@koa/multer");
const fs = require("fs");
const { UPLOAD_PATH } = require("../config/path");
const uuidGenerate = require("../utils/uuid-generate");
const { PARAMETER_ERROR } = require("../config/error-constants");
const { fileSavePath } = require("../config/parameter");

let uploadPath = "";

/* 处理文件路径 */
const handleSavePath = async (ctx, next) => {
  console.log(ctx.userInfo);
  const { id } = ctx.userInfo;
  const { folder } = ctx.query;
  if (!folder | !fileSavePath.includes(folder)) {
    return ctx.app.emit("error", PARAMETER_ERROR, ctx);
  }
  console.log("folder,userId", folder, id);
  if (folder && id) {
    // folder:文件夹名  userId：用户id  articleId：文章id
    dest = `${UPLOAD_PATH}/${folder}/${id}`;
  } else {
    dest = `${UPLOAD_PATH}`;
  }
  // else if (folder) {
  //   // folder:文件夹名 eg.avatar
  //   dest = `${UPLOAD_PATH}/${folder}`;
  // }

  // 检查目录是否存在，如果不存在则创建之
  /* 
    fs.promises.access() 方法检查目标路径是否存在，如果存在则什么也不做；
    如果不存在则会抛出一个错误。我们使用 try-catch 语句来捕获该错误，
    并在 catch 分支中使用 fs.promises.mkdir() 方法创建目录。

    access() 方法用于测试用户对指定路径的文件或文件夹的权限。
    fs.constants.F_OK 是它的第二个参数，表示要测试文件的可见性。
    如果指定的路径存在，则该方法不执行任何操作并返回 undefined。
    如果路径不存在，则该方法会抛出一个错误。

    mkdir() 方法用于异步地创建一个新的文件夹。
    我们将第二个参数 { recursive: true } 传递给该方法，表示应该创建整个路径中缺失的所有目录。
  */
  try {
    await fs.promises.access(dest, fs.constants.F_OK);
  } catch (err) {
    await fs.promises.mkdir(dest, { recursive: true });
  }

  uploadPath = dest;

  ctx.uploadPath = uploadPath;

  // 3.执行下一个中间件
  await next();
};

const uploadFile = multer({
  /* 
      这样写相对路径，会将uploads文件夹放到根目录下
      因为启动目录是“./src/main.js”，所以.会相对于根目录创建文件夹
   */
  //   dest: "./uploads",
  storage: multer.diskStorage({
    destination(req, file, cb) {
      //第一个参数是到达目的地有没有错误
      //第二个参数是准备存放的路径
      cb(null, uploadPath);
    },
    filename(req, file, cb) {
      //第一个参数是到达目的地有没有错误;
      //第二个参数是自定义文件名称
      // console.log(file);
      const imageType = file.originalname.split(".");
      // cb(null, Date.now() + "_"  + "." + imageType[1]);
      cb(null, uuidGenerate() + "." + imageType[1]);
      // cb(null, Date.now());
    },
  }),
});

// 单文件上传 singleFile是文件的请求字段名
const handleSingleFile = uploadFile.single("singleFile");
// 多文件上传 fileArray是文件的请求字段名
const handleFileArray = uploadFile.array("fileArray");

module.exports = {
  handleSavePath,
  handleSingleFile,
  handleFileArray,
};
